package com.atguigu.gmall.order.service;

import com.atguigu.gmall.enums.model.ProcessStatus;
import com.atguigu.gmall.order.model.OrderInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.junit.jupiter.api.Order;

import java.util.List;
import java.util.Map;

/**
 * @author: atguigu
 * @create: 2023-01-12 10:24
 */
public interface OrderInfoService extends IService<OrderInfo> {
    Map<String, Object> trade(String userId);

    /**
     * 订单提交-保存
     * @param orderInfo 订单信息
     * @param tradeNo
     * @return
     */
    Long submitOrder(OrderInfo orderInfo, String tradeNo);


    /**
     * 生成流水号-防止订单重复提交
     * @param userId
     * @return
     */
    String getTradeCode(String userId);

    /**
     * 查询订单列表
     * @param orderPage
     * @param userId
     * @param status
     * @return
     */
    IPage<Order> getOrder(IPage<Order> orderPage, String userId, String status);



    /**
     * 验证流水号是否一致
     * @param userId
     * @param tradeCode
     * @return
     */
    //Boolean checkTradeCode(String userId, String tradeCode);


    /**
     * 删除流水号
     * @param userId
     */
    //void deleteTradeCode(String userId);


    /**
     * 关闭订单
     * @param orderId
     */
    void execExpiredOrder(Long orderId);

    /**
     * 按照指定状态修改订单
     * @param orderId
     * @param processStatus
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);


    /**
     * 根据订单ID查询订单信息
     * @param orderId 订单ID
     * @return
     */
    OrderInfo getOrderInfo(Long orderId);

    /**
     * 发送扣减库存消息到MQ 通知 仓库系统
     * 消息格式JSON字符串包含什么数据？查询订单订单明细
     *
     * @param orderId
     */
    void sendDeductStockMsg(Long orderId);


    /**
     * 将订单订单明细转为Map 后续该方法被复用
     * @param orderInfo
     * @return
     */
    Map initWareOrder(OrderInfo orderInfo);


    /**
     * 完成拆分订单业务
     * @param orderId
     * @param wareSkuMap
     * @return
     */
    String orderSplit(Long orderId, String wareSkuMap);


    /**
     * 秒杀订单保存
     * @param orderInfo
     * @return
     */
    Long submitSeckillOrder(OrderInfo orderInfo);
}
